# 一、定义一个学生Student类。有下面的类属性：
# 1 姓名 name
# 2 年龄 age
# 3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
"""
class Student:
    def __init__(self,name,age,score):
        self.name = name
        self.age = age
        self.score = score
# 类方法：
#  1 获取学生的姓名：get_name() 返回类型:str
    def get_name(self):
        return str(self.name)
# 2 获取学生的年龄：get_age() 返回类型:int
    def get_age(self):
        return int(self.age)
# 3 返回3门科目中最高的分数。get_course() 返回类型:int
    def get_course(self):
        return int(max(self.score))
# 4 将每个实例学生对象写进txt文件里，要持久保存
    def get_student(self):
        with open("student1121.txt","a",encoding="utf-8")as f:
            f.write(str({"姓名":self.name,"年龄":self.age,"成绩":{"语文":self.score[0],"shuxue":self.score[1],"yingyu":self.score[2]}})+"\n")
# 举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
# 5 获取所有学生的信息
    def get_suoyou_student(self):
        with open("student1121.txt","r",encoding="utf-8") as f:
            a = f.read()
            print(a)
zm = Student('zhangming', 20, [69, 88, 100])
zp = Student('zhangp',20,[69,88,100])
zm.get_student()
zp.get_student()
zm.get_suoyou_student()
"""
# 写好类以后，可以定义2个同学测试下:
# zm = Student('zhangming',20,[69,88,100])
"""
class Student:#定义一个名为Student的类。
    def __init__(self,name,age,score):#在类的初始化方法中，接收三个参数：name（姓名）、age（年龄）和course（课程）。
        self.name = name#将传入的参数分别赋值给实例变量self.name、self.age和self.coures。
        self.age= age
        self.coures = score
    def get_name(self):#定义一个名为get_name的方法，返回实例变量self.name的字符串形式。
        return str(self.name)
    def get_age(self):#定义一个名为get_age的方法，返回实例变量self.age的整数值。
        return int(self.age)
    def get_course(self):#定义一个名为get_course的方法，返回实例变量self.course中的最大值的整数值。
        return int(max(self.score))
        
    def get_student(self):#定义一个名为get_student的方法，将实例的信息写入名为"student21.txt"的文件中。
        with open("student21.txt","a",encoding="utf-8") as f:
            f.write(str({"姓名":self.name,"年龄":self.age,"成绩":{"语文":self.coures[0],"数学":self.coures[1],"英语":self.coures[2]}})+"\n")
    def get_all_student(self):
        with open("student21.txt", "r", encoding="utf-8") as f:
            a = f.read()
        print(a)
zm = Student('zhangming',20,[69,88,100])#创建一个名为zm的Student实例，传入姓名'zhangming'、年龄20和课程[69,88,100]。
zp = Student('zhangp',20,[69,88,100])#创建一个名为zp的Student实例，传入姓名'zhangp'、年龄20和课程[69,88,100]。
zm.get_student()#调用zm实例的get_student方法，将zm的信息写入文件。
zp.get_student()#调用zp实例的get_student方法，将zp的信息写入文件。
zm.get_all_student()#调用zm实例的get_all_student方法，打印出所有学生的信息。
 """
# 二、定义一个字典类：dictclass。完成下面的功能：
# 1 删除某个key
# 2 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
# 3 返回键组成的列表：返回类型;(list)
# 4 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)
"""
class Dictclass: #定义一个名为Dictclass的类，首字母大写。
    def __init__(self,my_dict):#在类的构造函数中，接收一个名为my_dict的参数，
        self.my_dict = my_dict#并将其赋值给self.my_dict。

    def delete_key(self,key):#定义一个名为delete_key的方法，接收一个名为key的参数
        if key in self.my_dict:#判断key是否在self.my_dict中，
            del self.my_dict[key]#如果在，则删除该键值对，并返回"删除成功"
            return "删除成功"
        else:
            return "删除失败"#；否则返回"删除失败"。

    def find_key(self,key):#定义一个名为find_key的方法，接收一个名为key的参数。
        return self.my_dict.get(key,"not found")#使用字典的get方法查找key对应的值，如果找到，则返回该值；否则返回"not found"。

    def get_keys(self):#定义一个名为get_keys的方法
        return list(self.my_dict.keys())#使用字典的keys方法获取所有的键，并将其转换为列表返回。

    def x(self, other_dict):#定义一个名为x的方法，接收一个名为other_dict的参数。
        self.my_dict.update(other_dict)#使用字典的update方法将other_dict中的键值对更新到self.my_dict中。
        return list(self.my_dict.values())#使用字典的values方法获取所有的值，并将其转换为列表返回。

my_dict= {"a":1,"b":2,"c":3,"d":4,"e":5}#创建一个名为my_dict的字典，包含键值对{"a":1,"b":2,"c":3,"d":4,"e":5}。
bb = Dictclass(my_dict)#创建一个名为bb的Dictclass对象，并将my_dict作为参数传入。
print(bb.delete_key("b"))#调用bb对象的delete_key方法，传入参数"b"，并打印返回结果。
print(bb.find_key("g"))#调用bb对象的find_key方法，传入参数"g"，并打印返回结果。
print(bb.get_keys())#调用bb对象的get_keys方法，并打印返回结果。
other_dict = {"f":6,"g":8,"h":0}#创建一个名为other_dict的字典，包含键值对{"f":6,"g":8,"h":0}。
print(bb.x(other_dict))#调用bb对象的x方法，传入参数other_dict，并打印返回结果。
"""
# 四、定义一个列表的操作类：Listinfo
# 包括的方法:
# 1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
# 2 列表元素取值：get_key(num) [num:整数类型]
# 3 列表合并：update_list(list) [list:列表类型]
# 4 删除并且返回最后一个元素：del_key()
#  五、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！
# 六、点餐管理系统
# 1》、餐馆可以新增菜品、下架菜品、修改菜品
# 2》、每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1
# 菜品有对应的价格，餐厅老板定义价格每道菜不允许超过15元，没有小数单位，均为整数
# 3》、餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分
# 4》、有菜品评分提报功能，对平均分数（菜品总分/打分人数）低于3分的菜品进行强制下架；
#  七、定义一个桌子类（Desk），包含长（length）、宽（width）、高（height）属性，
# 包含一个打印桌子信息属性的方法（showInfo）。实例化2个桌子对象，为其赋予不同的属性值，
# 并调用showInfo方法，输出每个桌子的信息。
# 八、定义一个用户类(User),用户名(username)和密码(password)是这个类的属性。
# 九、定义一个计算器类，有加减乘除四个方法
# 十、创建一个名为Person的类，具有以下属性和方法：
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
# 十一、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果
# 十二、创建一个名为"Car"的类，该类具有"品牌"和"颜色"属性。
# 创建一个"start_engine"方法，该方法打印出"启动汽车引擎！"的消息。
# 创建一个"stop_engine"方法，该方法打印出"关闭汽车引擎！"的消息
# 十三、淘宝商家后台，可以上架商品、下架商品，功能如下：
#  （1） 可以添加商品，商家添加完的商品会存到商品列表
#  1.1  商品要有名称、sku、价格
#  （2） 可以修改商品信息：名称、sku、价格
#  （3） 可以对商品进行下架，下架后的商品不再展示
# 十四、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤

class ren:#定义一个名为ren的类，
    def __init__(self, name, zhongliang):#__init__方法是一个特殊的方法，接受两个参数：name和zhongliang，
        self.name = name#分别赋值给对象的name和zhongliang属性。
        self.zhongliang = zhongliang

    def runing(self):#调用这个方法
        self.zhongliang -= 0.5#每次调用这个方法，属性值-0.5

    def eat(self):#调用这个方法
        self.zhongliang += 1#每次调用这个方法，属性值+1

# 创建对象
xiaoming = ren("小明", 75.0)
xiaomei = ren("小美", 45.0)

# 小明和小美跑步
xiaoming.runing()
xiaomei.runing()
print(f"{xiaoming.name}跑步后体重：{xiaoming.zhongliang}公斤")
print(f"{xiaomei.name}跑步后体重：{xiaomei.zhongliang}公斤")
# 小明和小美吃东西
xiaoming.eat()
xiaomei.eat()
print(f"{xiaoming.name}吃东西后体重：{xiaoming.zhongliang}公斤")
print(f"{xiaomei.name}吃东西后体重：{xiaomei.zhongliang}公斤")
"""
# 十五、士兵瑞恩有一把ak47
# 士兵可以开火（开火扣动的是扳机）
# 枪能够发射子弹（把子弹打出去）
# 抢能够装子弹–增加子弹数量
# 要求没子弹，需要输出没有子弹了，且发射失败
"""